JavaScript函数方法
方法也可以称作为函数:函数就是语句的封装,可以让这些代码被方便的被复用,函数具有如下特点:
1、一次定义,多次调用
2、简化代码,让代码具有可读性
一、函数的定义与调用
1.使用 function
来定义函数,只有调用函数才会执行函数中的代码
function test() {
console.log(1)
}
console.log(2)
test()
2.函数和变量类似,也可以先调用后定义,即”函数声明提升“
test()
function test() {
console.log(1)
}
console.log(2)
3.通过表达式创建的函数,则没有提升特性
test()
var test = function () {
console.log(1)
}
console.log(2)
二、函数的参数
1.参数是函数内的一些待定值(形参),在调用函数时,必须传入这些参数的具体值(实参)
// 计算连续数字的和,比如1-10
function calculateTotal(startNumber, endNumber) {
var sum = 0
for (var i = startNumber; i <= endNumber; i++) {
sum += i
}
console.log(`${startNumber}-${endNumber}的和是:`, sum)
}
calculateTotal(1, 10)
2.函数的参数可多可少,函数可以没有参数,也可以有多个参数,多个参数之间需要用逗号隔开
三、函数的返回值
函数体内可以使用return关键字标识”函数返回的值“
// 计算连续数字的和,比如1-10
function calculateTotal(startNumber, endNumber) {
var sum = 0
for (var i = startNumber; i <= endNumber; i++) {
sum += i
}
return sum
}
console.log(`1-10的和是:`, calculateTotal(1, 10))
四、局部变量和全局变量
1.javascript是函数级作用域编程语言:变量只在其定义是所在的函数内部有意义
局部变量:
function demo() {
var a = 10
console.log('函数内调用:', a)
}
demo()
console.log('函数外调用:', a)
全局变量:
var a = 10
function demo() {
console.log('函数内调用:', a)
}
demo()
console.log('函数外调用:', a)
2.遮蔽效应:当全局变量和局部变量重名,则函数内的变量会将全局变量"遮蔽"。改变局部变量,不会影响全局变量。
var a = 10
function demo() {
a++
var a = 5
console.log('函数内调用:', a)
}
demo()
console.log('函数外调用:', a)
3.形参也是局部变量
4.函数中不加var将定义全局变量
function demo() {
a = 10
}
demo()
console.log('函数外调用:', a)
五、闭包
JavaScript中函数会产生闭包(closure)。闭包是函数本身和该函数声明时所处的环境状态的组合。
1 函数能够“记忆住”其定义时所处的环境,即使函数不在其定义的环境中被调用,也能访问定义时所处环境的变量,这就是闭包的记忆性
- 当闭包产生时,函数所处环境的状态会始终保持在内存中,不会在外层函数调用后被自动清除。这就是闭包的记忆性。
- 函数能够“记忆住”其定义时所处的环境,即使函数不在其 定义的环境中被调用,也能访问定义时所处环境的变量。
function demo() {
var a = 5
function demoInner() {
console.log(a)
}
return demoInner
}
var func = demo()
func()
2 闭包还可以用来模拟私有变量,例子:要求1:创建一个体温检测函数,传入当前体温temperature,即可返回体温是否正常;要求2:不同的小区有不同的体温检测标准,比如A小区体温合 格线是37.1°C,而B小区体温合格线是37.3°C
// 要求1
function checkTemperature(temperature) {
if (temperature > 37.5) {
console.log('您的体温偏高')
} else {
console.log('您的体温偏低')
}
}
// 同时满足要求2
function initFunc(standardTemperature) {
function checkTemperature(temperature) {
if (temperature > standardTemperature) {
console.log('您的体温偏高')
} else {
console.log('您的体温偏低')
}
}
return checkTemperature
}
var village1Func = initFunc(37.1)
var village2Func = initFunc(37.3)
console.log(village1Func(37.2))
console.log(village2Func(37.0))
3 注意:不能滥用闭包,否则会造成网页的性能问题,严重时可能导致内存泄露。所谓内存泄漏是指程序中己动态分配的内存由于某种原因未释放或无法释放。
六、分析以下代码执行结果
// 要求1
function addCount() {
var count = 0
return function () {
count += 1
console.log(count)
}
}
var func1 = addCount()
var func2 = addCount()
fun1()
fun2()
fun2()
fun1()